/* 
 * JornadaTrabalhoInsertUpdateRule.java
 * 
 * Data de criação: 03/10/2010
 * 
 * O2SOLUTIONS - SOLUÇÕES EM TECNOLOGIA DA INFORMAÇÃO.ÇÕES EM TECNOLOGIA DA INFORMAÇÃO. 
 *
 */
package br.com.o2solutions.siso.business.rule.jornada.trabalho;

import java.util.List;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import br.com.o2solutions.core.exception.BusinessException;
import br.com.o2solutions.core.integration.repository.DataBaseIntegration;
import br.com.o2solutions.core.service.rule.Rule;
import br.com.o2solutions.siso.integration.entidade.JornadaTrabalho;
import br.com.o2solutions.util.assertion.Assert;

/**
 * Classe responsável por realizar a validação no ato de persistência ou
 * atualização de uma jornada de trabalho, quanto as horas de trabalho, descanso
 * e descrição.
 * 
 * @author Ivan
 * @since 03/10/2010
 * 
 */
@Component("jornadaTrabalhoInsertUpdateRule")
public class JornadaTrabalhoInsertUpdateRule implements Rule<JornadaTrabalho> {

	@Value("#{jornadaTrabalhoDAO}")
	private DataBaseIntegration<JornadaTrabalho> jornadaTrabalhoDAO;

	@Override
	public void check(JornadaTrabalho jornadaTrabalho) throws BusinessException {
		Assert
				.isTrue(
						jornadaTrabalho.getHorasDescanso()
								/ jornadaTrabalho.getHorasTrabalho() >= 2,
						new BusinessException(
								"O horário de descanso deverá ser no mínimo o dobro do horário de trabalho.",
								"error.grupo.jornada.trabalho.regra.horario"));

		List<JornadaTrabalho> resultList = jornadaTrabalhoDAO
				.findByNamedQuery(
						"JornadaTrabalho.findByDescricaoHoraTrabalhoHoraDescanso",
						jornadaTrabalho.getDescricao(), 
						jornadaTrabalho.getHorasTrabalho(), 
						jornadaTrabalho.getHorasDescanso());
		
		resultList.remove(jornadaTrabalho);
		
		Assert.isEmpty(resultList , new BusinessException(
				"Jornada de trabalho já cadastrada com os dados informados.",
				"error.jornada.trabalho.existis", jornadaTrabalho.getDescricao(), 
				jornadaTrabalho.getHorasTrabalho(), 
				jornadaTrabalho.getHorasDescanso()));
		
		
	}

}
